#ifndef MYSQL_CONNPOOL_HPP
#define MYSQL_CONNPOOL_HPP
#include <vector>
#include <mysql/mysql.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

class mysql_conn_pool
{
private:
    //空闲池
    std::vector<MYSQL *> m_vecIdleMysql;
    //活动池
    std::vector<MYSQL *> m_vecExerciseMysql;

private:
    mysql_conn_pool()
    {
    }

    ~mysql_conn_pool()
    {
        for (size_t i = 0; i < m_vecIdleMysql.size(); i++)
        {
            mysql_close(m_vecIdleMysql[i]);
        }
        m_vecIdleMysql.clear();

        for (size_t i = 0; i < m_vecExerciseMysql.size(); i++)
        {
            mysql_close(m_vecExerciseMysql[i]);
        }
        m_vecExerciseMysql.clear();
    }

public:
    static mysql_conn_pool *get()
    {
        static mysql_conn_pool _obj;
        return &_obj;
    }

    bool init(const char *host, const int port,
              const char *username, const char *password,
              const char *sourcename, int max)
    {
        for (int i = 0; i < max; i++)
        {
            MYSQL *conn;
            conn = mysql_init(NULL);
            if (conn == NULL)
            {
                continue;
            }

            if (!mysql_real_connect(conn, host, username, password,
                                    sourcename, port, NULL, 0))
            {
                char error_msg[100];
                strncpy(error_msg, mysql_error(conn), 99);
                printf("%s\n", error_msg);
                mysql_close(conn);
            }
            else
            {
                m_vecIdleMysql.push_back(conn);
            }
        }
        printf("mysql 连接池初始化成功,可用连接为:%d\n", m_vecIdleMysql.size());
    }

    MYSQL *get_connect()
    {
        if (m_vecIdleMysql.size() == 0)
        {
            return NULL;
        }

        //从头部获取
        MYSQL *p = m_vecIdleMysql.front();
        m_vecIdleMysql.erase(m_vecIdleMysql.begin());

        //添加到活动表
        m_vecExerciseMysql.push_back(p);

        return p;
    }

    bool disconnect(MYSQL *p)
    {
        auto ite = m_vecExerciseMysql.begin();
        for (; ite != m_vecExerciseMysql.end(); ite++)
        {
            //找到对应迭代器
            if (p == *ite)
            {
                //活动表移除
                m_vecExerciseMysql.erase(ite);
                //添加空闲表
                m_vecIdleMysql.push_back(p);
                return true;
            }
        }
        return false;
    }
};
#endif